const ProviderType = {
	IAP: 'iap'
}
const IapTransactionState = {
	purchasing: "0", // A transaction that is being processed by the App Store.
	purchased: "1", // A successfully processed transaction.
	failed: "2", // A failed transaction.
	restored: "3", // A transaction that restores content previously purchased by the user.
	deferred: "4" // A transaction that is in the queue, but its final status is pending external action such as Ask to Buy.
};
class Iap {
	_channel = null;
	_channelError = null;
	_productIds = [];
	_ready = false;
	constructor({
		products
	}) {
		this._productIds = products;
	}
	init() {
		return new Promise((resolve, reject) => {
			this.getChannels((channel) => {
				this._ready = true;
				console.log("iapInitsu:");
				resolve(channel);
			}, (err) => {
				console.log("iapInitErr:" + JSON.stringify(err));
				reject(err);
			})
		})
	}
	getProduct(productIds) {
		return new Promise((resolve, reject) => {
			this._channel.requestProduct(productIds || this._productIds, (res) => {
				resolve(res);
			}, (err) => {
				reject(err);
			})
		});
	}
	requestPayment(orderInfo, fail) {
		return new Promise((resolve, reject) => {
			uni.requestPayment({
				provider: 'appleiap',
				orderInfo: orderInfo,
				success: (res) => {
					resolve(res);
				},
				fail: (err) => {
					reject(err);
				}
			});
		});
	}
	restoreCompletedTransactions(username) {
		return new Promise((resolve, reject) => {
			this._channel.restoreCompletedTransactions({
				manualFinishTransaction: true,
				username: username
			}, (res) => {
				console.log("restoreCompletedTransactions:" + JSON.stringify(res));
				resolve(res);
			}, (err) => {
				console.log("restoreCompletedTransactionsErr:" + JSON.stringify(err));
				reject(err);
			})
		});
	}
	finishTransaction(transaction) {
		return new Promise((resolve, reject) => {
			this._channel.finishTransaction(transaction, (res) => {
				console.log("finishTransaction:" + JSON.stringify(res));
				resolve(res);
			}, (err) => {
				console.log("finishTransactionErr:" + err.errMsg);
				reject(err);
			});
		});
	}
	getChannels(success, fail) {
		if (this._channel !== null) {
			success(this._channel)
			return
		}
		if (this._channelError !== null) {
			fail(this._channelError)
			return
		}
		uni.getProvider({
			service: 'payment',
			success: (res) => {
				console.log(res);
				this._channel = res.provider.find((channel) => {
					console.log("getchannel:" + channel.id);
					return (channel.id === 'appleiap')
				})
				if (this._channel) {
					success(this._channel)
				} else {
					console.log("getchannelErr:");
					this._channelError = {
						errMsg: 'paymentContext:fail iap service not found'
					}
					fail(this._channelError)
				}
			}
		});
	}
	get channel() {
		return this._channel;
	}
}
export {
	Iap,
	IapTransactionState
}